<?php
def("amicitia/persistencia/daos/","ConexionBD");
def("amicitia/persistencia/excepciones/","QueryException");
def("amicitia/persistencia/excepciones/","ConexionNoInicializadaException");

/**
 * Se encarga de otorgar acceso a una base de datos MySQL.
 *
 * @author Willy A. Kuster
 */
class ConexionBDMySql extends ConexionBD {

	private $mysqli;
	private $host;
	private $usuario;
	private $password;
	private $bd;

	public function __construct() {
		$this->host = conf("conexion_bd","host");
		$this->usuario = conf("conexion_bd","usuario");
		$this->password = conf("conexion_bd","password");
		$this->bd = conf("conexion_bd","bd");
	}

	/**
	 * Crea una conexión a una base de datos usando la información d
	 * configuración y selecciona una base de datos.
	 */
	public function conectar() {

		if (!isset($this->mysqli)) {
			$this->mysqli = new mysqli($this->host, $this->usuario, $this->password, $this->bd);
			if ($this->mysqli->connect_error) {
				die($this->mysqli->connect_error);
			}
			$this->mysqli->autocommit(FALSE);
			$this->mysqli->query("SET NAMES 'utf8'");//importante para la consistencia del encoding.
		}

	}

	/**
	 * Cierra la conexión a la base de datos.
	 */
	public function desconectar() {
		if(isset($this->mysqli)) {
			$this->mysqli->close();
			unset($this->mysqli);
		} else 
			throw new ConexionNoInicializadaException();
	}

	/**
	 * Ejecuta un query de tipo SELECT y devuelve el resultado generado.
	 *
	 * @param $query
	 * 			El query a ejecutar.
	 * @return Un 'resource' o false si no se pudo ejecutar el query.
	 */
	public function seleccionar($query) {
		if(isset($this->mysqli)) {
			$result = $this->mysqli->query($query);
			if($result){
				return $result;
			} else {
				throw new QueryException($query, $this->mysqli->error);
			}
		} else 
			throw new ConexionNoInicializadaException();
	}

	/**
	 * Ejecuta un query de tipo INSERT y devuelve el id del elemento insertado.
	 *
	 * @param $query
	 * 			El query a ejecutar.
	 * @return El id del elemento insertado o false si no se pudo ejecutar el
	 * query.
	 */
	public function insertar($query) {
		if(isset($this->mysqli)) {
			if($this->mysqli->query($query)){
				return $this->mysqli->insert_id;
			} else {
				throw new QueryException($query, $this->mysqli->error);
			}
		} else 
			throw new ConexionNoInicializadaException();
	}

	/**
	 * Ejecuta un query de tipo UPDATE o DELETE y devuelve el número de filas
	 * que fueron afectadas.
	 *
	 * @param $query
	 * 			El query a ejecutar.
	 * @return El número de filas que fueron afectadas o false si no se pudo
	 * ejecutar el query.
	 */
	public function actualizarOEliminar($query) {
		if(isset($this->mysqli)) {
			if($this->mysqli->query($query)){
				return $this->mysqli->affected_rows;
			} else {
				throw new QueryException($query, $this->mysqli->error);
			}
		} else 
			throw new ConexionNoInicializadaException();
	}

	/**
	 * Concreta la transacción actual.
	 */
	public function concretar() {
		if(isset($this->mysqli)) {
			$this->mysqli->commit();
		} else 
			throw new ConexionNoInicializadaException();
	}

	/**
	 * Deshace la transacción actual.
	 */
	public function deshacer() {
		if(isset($this->mysqli)) {
			$this->mysqli->rollback();
		} else 
			throw new ConexionNoInicializadaException();
	}

	/**
	 * Escapa la cadena ingresada de acuerdo al tipo de conexión.
	 *
	 * @param $cadena
	 * 			La cadena a escapar.
	 * @return La cadena escapada.
	 */
	public function escaparCadena($cadena) {
		if(isset($this->mysqli)) {
			return $this->mysqli->real_escape_string($cadena);
		} else 
			throw new ConexionNoInicializadaException();
	}

	/**
	 * Reinicia la secuencia de Auto_increment para la tabla especificada.
	 *
	 * @param $tabla
	 * 			El nombre de la tabla.
	 */
	public function reiniciarAutoincrement($tabla) {
		if(isset($this->mysqli)) {
			$query = "ALTER TABLE $tabla AUTO_INCREMENT=1";
			$this->mysqli->query($query);
		} else 
			throw new ConexionNoInicializadaException();
	}

}
?>